// 定义函数的时候可以分为：无参数无返回值，有参数无返回值，有参数有返回值，无参数有返回值

// 无参数无返回值
function a() {
    console.log(1);
}

// 定义一个无参数无返回值的函数
// :void 表示的是该函数没有返回值
// : 冒号后面的是返回值类型
function fn1(): void {
    console.log(1);
}

// 定义一个无参数有一个字符串类型的返回值
function fn2(): string {
    console.log(1);
    return '你好世界'
}


// 定义一个有一个字符串参数，无返回值的函数
function fn3(name: string): void {
    console.log(1, name);
}

// 有参数有返回值
function fn4(price: number): number {
    return price * 0.8
}

// 返回值是对象类型
function fn5(): {
    name: string;
    age: number;
} {
    return {
        name: '张三',
        age: 18
    }
}

// 返回值类型是一个对象
interface iUser {
    name: string
    age: number
}

function fn6(): iUser {
    return {
        name: '张三',
        age: 18
    }
}

function fn7(): number[] {
    return [1, 2, 3, 4, 5]
}


function fn8(): Array<number> {
    return [1, 2, 3, 4, 5]
}

// 带有多个参数，有一个可选参数和一个默认值的参数
// a: any 任意类型，不确定数据类型的时候使用
// b: number 数字类型
// c?: string 定义可选参数
// d: boolean = true 定义带有默认值的参数
/*
    function fn9(参数: 参数类型, ...): 返回值类型 {
        return 返回值
    }
*/
function fn9(a: any, b: number, c?: string, d: boolean = true): string {
    return ''
}


// f1 类型是一个箭头函数，而且没有参数和返回值
const f1: () => void = (): void => { }


const f2: () => number = function (): number {
    return 10
}

const f3: (a: number) => number = function (a: number): number {
    return 10
}


// 带有对象参数和对象返回值的函数
const f4: (obj: iUser) => iUser = (obj: iUser): iUser => {

    return {
        name: '',
        age: 1
    }
}


